package doublePtr

/*
双指针-优雅版
时间复杂度:O(N)
空间复杂度:O(1)
*/
func minimumRefill(plants []int, capacityA int, capacityB int) int {
	i, j := 0, len(plants)-1
	ca, cb := capacityA, capacityB
	count := 0
	// 中间那颗可以单独拿出来处理
	for i < j {
		if ca < plants[i] {
			ca = capacityA
			count++
		}
		ca -= plants[i]
		i++

		if cb < plants[j] {
			cb = capacityB
			count++
		}
		cb -= plants[j]
		j--
	}

	// 如果最后两人遇到同一个植物，且两个人的水量均少于植物需要的水量，则一个人加水即可,否则不用加水
	if i == j && ca < plants[i] && cb < plants[j] {
		count++
	}
	return count
}

/*
双指针-不优雅版
时间复杂度:O(N)
空间复杂度:O(1)
*/
func minimumRefill1(plants []int, capacityA int, capacityB int) int {
	i, j := 0, len(plants)-1
	ca, cb := capacityA, capacityB
	count := 0
	for i < j {
		// 这一步不优雅，可以优化为先判断是否缺水，缺水则加满，然后再无脑减去当前植物需要的水量
		if ca >= plants[i] {
			ca -= plants[i]
		} else {
			ca = capacityA - plants[i]
			count++
		}
		if cb >= plants[j] {
			cb -= plants[j]
		} else {
			cb = capacityB - plants[j]
			count++
		}
		i++
		j--
	}
	if i == j && ca < plants[i] && cb < plants[j] {
		count++
	}
	return count
}
